//穷举所有从根节点到最尾叶子节点的分支情况
const getAllTreeBranchesData = (tree: any, path = []) => {
  let branches: any[] = [];
  tree.forEach((node: any) => {
    let currentPath = [...path, node.value];
    if (node.children) {
      branches = [
        ...branches,
        ...getAllTreeBranchesData(node.children, currentPath),
      ];
    } else {
      branches.push(currentPath);
    }
  });
  console.log(1111, branches);
  return branches;
};

const treeData = [
    {
      value: '1',
      title: 'node1',
      children: [
        {
          value: '1-1',
          title: 'parent 1-0',
          children: [
            {
              value: '1-1-1',
              title: 'my leaf',
              children: [
                {
                  value: '1-1-1-1',
                  title: 'my leaf',
                },
                {
                  value: '1-1-1-2',
                  title: 'your leaf',
                },
              ],
            },
            {
              value: '1-1-2',
              title: 'your leaf',
            },
          ],
        },
        {
          value: '1-2',
          title: 'parent 1-0',
          children: [
            {
              value: '1-2-1',
              title: 'my leaf',
            },
            {
              value: '1-2-2',
              title: 'your leaf',
            },
          ],
        },
      ],
    },
  ];
  const allBranch = getAllTreeBranchesData(treeData)
/**
 * 
 * 在每次循环中，treeData.forEach(node => {...})会遍历树的每个节点，对于每个节点，会执行以下操作：

let currentPath = [...path, node.value];：将当前节点的值node.value添加到当前分支的路径path中，形成新的路径currentPath。

if (node.children) {：判断当前节点是否有子节点。

branches = [...branches, ...getBranches(node.children, currentPath)];：如果有子节点，递归调用getBranches函数，传入子节点和新的路径currentPath，将返回的分支数组与当前的branches数组合并。

else { branches.push(currentPath); }：如果没有子节点，将当前分支的路径currentPath添加到branches数组中。

这样，对于每个节点，都会将其值添加到当前分支的路径中，并判断是否有子节点。如果有子节点，则递归调用getBranches函数，传入子节点和新的路径，将返回的分支数组与当前的branches数组合并。如果没有子节点，则将当前分支的路径添加到branches数组中。最终，返回所有的分支数组。

在这个例子中，树的结构是多层嵌套的，每个节点包含value和title属性，以及可能的children属性，表示子节点。在第一次循环中，遍历到根节点{value: '1', title: 'node1', children: [...]}，将其值'1'添加到当前分支的路径中，即[ '1' ]，并判断是否有子节点。由于根节点有子节
点，因此递归调用getBranches函数，传入子节点和新的路径[ '1', '1-1' ]，继续遍历子节点。在第二次循环中，遍历到子节点{value: '1-1', title: 'parent 1-0', children: [...]}，将其值'1-1'添加到当前分支的路径中，即[ '1', '1-1' ]，并判断是否有子节点。由于子节点有子节点，因此递归调用
getBranches函数，传入子节点和新的路径[ '1', '1-1', '1-1-1' ]，继续遍历子节点。在第三次循环中，遍历到子节点{value: '1-1-1', title: 'my leaf', children: [...]}，将其值'1-1-1'添加到当前分支的路径中，即[ '1', '1-1', '1-1-1' ]，并判断是否有子节点。由于子节点有子节点，因此递归调用getBranches函数，传
入子节点和新的路径[ '1', '1-1', '1-1-1', '1-1-1-1' ]，继续遍历子节点。在第四次循环中，遍历到叶子节点{value: '1-1-1-1', title: 'my leaf'}，将其值'1-1-1-1'添加到当前分支的路径中，即[ '1', '1-1', '1-1-1', '1-1-1-1' ]，并判断是否有子节点。由于叶子节点没有子节点，将当前分支的路径[ '1', '1-1', '1-1-1', '1-1-1-1' ]添加到branches数组中。接下来，返回到上
一层递归，继续遍历子节点。在第四次循环中，遍历到叶子节点{value: '1-1-1-2', title: 'your leaf'}，将其值'1-1-1-2'添加到当前分支的路径中，即[ '1', '1-1', '1-1-1', '1-1-1-2' ]，并判断是否有子节点。由于叶子节点没有子节点，将当前分支的路径[ '1', '1-1', '1-1-1', '1-1-1-2' ]添加到branches数组中。接下来，返回到上一层递归，继续遍历子节点。在第三次循环中，遍历到子节点{value: '1-1-2', title: 'your leaf'}，将其值'1-1-2'添加到当前分支的路径中，即[ '1', '1-1', '1-1-2' ]，并判断是否有子节点。由于子节点没有子节点，将当前分支的路径[ '1', '1-1', '1-1-2' ]添加到branches数组中。接下来，返回到上一
层递归，继续遍历子节点。在第二次循环中，遍历到子节点{value: '1-2', title: 'parent 1-0', children: [...]}，将其值'1-2'添加到当前分支的路径中，即[ '1', '1-2' ]，并判断是否有子节点。由于子节点有子节点，因此递归调用getBranches函数，传入子节点和新的路径[ '1', '1-2', '1-2-1' ]，继续遍历子节点。在第三次循环中，遍历到叶子节点{value: '1-2-1', title: 'my leaf'}，将其值'1-2-1'添加到当前分支的路径中，即[ '1', '1-2', '1-2-1' ]，并判断是否有子节点。由于叶子节点没有子节点，将当前分支的路径[ '1', '1-2', '1-2-1' ]添加到branches数组中。接下来，返回到上一层递归，继续遍历子节点。在第三次循环中，遍历
到叶子节点{value: '1-2-2', title: 'your leaf'}，将其值'1-2-2'添加到当前分支的路径中，即[ '1', '1-2', '1-2-2' ]，并判断是否有子节点。由于叶子节点没有子节点，将当前分支的路径[ '1', '1-2', '1-2-2' ]添加到branches数组中。最终，返回所有的分支数组[ [ '1', '1-1', '1-1-1', '1-1-1-1' ], [ '1', '1-1', '1-1-1', '1-1-1-2' ], [ '1', '1-1', '1-1-2' ], [ '1', '1-2', '1-2-1' ], [ '1', '1-2', '1-2-2' ] ]。
 * 
 * 
 */